home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / msdos / mcpr / cprfrmsb.asm < prev    next >
Assembly Source File  |  1991-10-18  |  11KB  |  789 lines

  1.     page    95,132
  2. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  3. ;§                                                                          §
  4. ;§            マルチカラム コンパクト プリント ユーティリティ            §
  5. ;§                                                                          §
  6. ;§   Multicolumn Compact PRint utility   MCPR.EXE  Ver1.40    §
  7. ;§   ~           ~       ~~                                                 §
  8. ;§              Copyright (C) by 福地 邦雄 1989-1990. All rights reserved.  §
  9. ;§∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞§
  10.     public    newfile
  11.     public    getchar
  12.     public    ungetchar
  13.     public    setlinumber
  14.     public    fillineproc
  15.     public    filgapproc
  16.     public    initvaliable
  17.     public    initpgbuff
  18.     public    reducepagebuff
  19.     public    hdrpgupdate
  20.     public    fhandle
  21.     public    pageproc
  22.     public    asmpage
  23.     public    baspage
  24.     public    cpage
  25.     extrn    inttoasc0:near
  26.     extrn    inttoascs:near
  27.     extrn    asctoint:near
  28.     extrn    abort:near
  29. ;
  30. YES    equ    1
  31. NO    equ    0
  32. EXT    equ    3
  33. ;
  34. data    segment para    public    'DATA'
  35. ;
  36. extrn    pgbuf:dword
  37. extrn    pgbufseg:word
  38. extrn    pgbufsiz:word
  39. extrn    gapsize:word
  40. extrn    linsiz:word
  41. extrn    clmcnt:word
  42. extrn    lincnt:word
  43. extrn    linptr:dword
  44. extrn    curclm:word
  45. extrn    curlin:word
  46. extrn    curblk:word
  47. extrn    curpage:word
  48. extrn    inline:word
  49. extrn    linumb:word
  50. extrn    numclm:word
  51. extrn    pgwidth:word
  52. extrn    pgtype:word
  53. extrn    linumber:word
  54. extrn    printend:word
  55. extrn    marginleft:word
  56. extrn    marginhead:word
  57. extrn    hdrprint:word
  58. extrn    numsepchar:byte
  59. extrn    filebuf:dword
  60. extrn    filebufoff:word
  61. extrn    errorno:word
  62. extrn    header:dword
  63. extrn    nameptr:dword
  64. extrn    hdrpgnum:word
  65. extrn    hdrlinoff:word
  66. extrn    hdrlinseg:word
  67. extrn    hdrln2seg:word
  68. ;
  69. fhandle     dw        ?
  70. eofflag     dw        ?
  71. readsize    dw        ?
  72. ;
  73. deftitle    dw    NO
  74. feedflag    dw    NO
  75. pageproc    dw    nopage
  76. ;
  77.         db        '00000'
  78. numsetarea  db        '00000'
  79. ;
  80. freadmsg    db        'file read error',0dh,0ah
  81. frdmsgsiz   equ     $-freadmsg
  82. ;
  83. ptmtitle    db        'Print Time '
  84. ptmttlsz    equ        $-ptmtitle
  85. ;
  86. data    ends
  87. ;
  88. code    segment para    public    'CODE'
  89.     assume    cs:code,ds:data
  90. ;
  91. newfile     proc
  92. ;
  93.     mov    fhandle,ax
  94.     xor    ax,ax
  95.     mov    eofflag,ax
  96.     mov    readsize,ax
  97.     mov    filebufoff,ax
  98.     ret
  99. ;
  100. newfile     endp
  101. ;
  102. getchar     proc
  103. ;
  104.     push    es
  105.     push    di
  106.     push    dx
  107.     xor    ax,ax
  108.     cmp    eofflag,YES
  109.     je    short eofstatus
  110. ;
  111.     les    di,filebuf
  112.     cmp    di,readsize
  113.     jb    existdata
  114.     call    readfile
  115.     xor    ax,ax
  116. existdata:
  117.     mov    al,es:[di]
  118.     inc    filebufoff
  119.     cmp    al,1ah
  120.     jne    getcharend
  121.     mov    eofflag,YES
  122. eofstatus:
  123.     dec    ah
  124. getcharend:
  125.     test    ah,ah
  126.     pop    dx
  127.     pop    di
  128.     pop    es
  129.     ret
  130. ;
  131. getchar     endp
  132. ;
  133. readfile    proc
  134. ;
  135.     mov    bx,fhandle
  136.     mov    cx,8192
  137.     xor    dx,dx
  138.     mov    di,dx
  139.     mov    filebufoff,di
  140.     push    ds
  141.     mov    ax,es
  142.     mov    ds,ax
  143.     mov    ah,3fh
  144.     int    21h
  145.     pop    ds
  146.     jc    readerr
  147.     mov    readsize,ax
  148.     test    ax,ax
  149.     jz    readeof
  150.     ret
  151. readeof:
  152.     mov    byte ptr es:[di],1ah
  153.     ret
  154. readerr:
  155.     mov    errorno,ax
  156.     mov    dx,offset freadmsg
  157.     mov    cx,frdmsgsiz
  158.     jmp    abort
  159. ;
  160. readfile    endp
  161. ;
  162. ungetchar   proc
  163. ;
  164.     dec    filebufoff
  165.     ret
  166. ;
  167. ungetchar   endp
  168. ;
  169. setlinumber proc
  170. ;
  171.     push    ax
  172.     mov    di,curlin
  173.     shl    di,1
  174.     shl    di,1
  175.     les    di,[di+offset linptr]
  176.     cmp    linumb,YES
  177.     jne    linumend
  178.     cmp    curclm,0
  179.     jne    linumend
  180.     cmp    inline,YES
  181.     je    nosetlinum
  182.     mov    inline,YES
  183.     mov    ax,linumber
  184.     mov    si,di
  185.     push    es
  186.     push    ds
  187.     pop    es
  188.     mov    di,offset numsetarea
  189.     call    inttoasc0
  190.     xchg    si,di
  191.     mov    cx,numclm
  192.     sub    si,cx
  193.     pop    es
  194.     rep movsb
  195.     mov    al,numsepchar
  196.     stosb
  197.     jmp    short linumend
  198. nosetlinum:
  199.     mov    al,' '
  200.     mov    cx,numclm
  201.     inc    cx
  202.     rep stosb
  203. linumend:
  204.     pop    ax
  205.     ret
  206. ;
  207. setlinumber endp
  208. ;
  209. fillineproc proc
  210. ;
  211.     mov    cx,clmcnt
  212.     sub    cx,curclm
  213.     mov    al,' '
  214.     rep stosb
  215.     mov    bx,curlin
  216.     shl    bx,1
  217.     shl    bx,1
  218.     mov    [bx+offset linptr],di
  219.     ret
  220. ;
  221. fillineproc endp
  222. ;
  223. filgapproc  proc
  224. ;
  225.     mov    dx,gapsize
  226.     test    dx,dx
  227.     jz    nogapsize
  228.     mov    dh,byte ptr lincnt
  229.     mov    bx,offset linptr
  230.     xor    cx,cx
  231.     mov    al,' '
  232. setgaploop:
  233.     mov    cl,dl
  234.     les    di,[bx]
  235.     rep stosb
  236.     mov    [bx],di
  237.     lea    bx,[bx+4]
  238.     dec    dh
  239.     jnz    setgaploop
  240. nogapsize:
  241.     ret
  242. ;
  243. filgapproc  endp
  244. ;
  245. initvaliable    proc
  246. ;
  247.     mov    linumber,0
  248.     mov    curpage,1
  249.     mov    printend,NO
  250.     mov    feedflag,NO
  251.     mov    ax,linsiz
  252.     mov    cl,4
  253.     shr    ax,cl
  254.     mov    bx,offset linptr
  255.     mov    cx,lincnt
  256.     xor    dx,dx
  257.     mov    si,pgbufseg
  258. bufptrloop:
  259.     mov    [bx],dx
  260.     mov    [bx+2],si
  261.     add    si,ax
  262.     lea    bx,[bx+4]
  263.     loop    bufptrloop
  264. ;
  265.     cmp    pgtype,EXT
  266.     je    pgtypechk
  267.     jmp    short sethdr
  268. pgtypechk:
  269.     les    di,nameptr
  270.     les    di,es:[di]
  271.     xor    ax,ax
  272.     mov    cx,-1
  273.   repne    scasb
  274.     cmp    word ptr es:[di-3],'MS'
  275.     jne    pgtypea1
  276.     cmp    word ptr es:[di-5],'A.'
  277.     je    pgtypeas
  278. pgtypea1:
  279.     cmp    word ptr es:[di-3],'CA'
  280.     jne    pgtypea2
  281.     cmp    word ptr es:[di-5],'M.'
  282.     je    pgtypeas
  283. pgtypea2:
  284.     cmp    word ptr es:[di-3],'CN'
  285.     jne    pgtypeb
  286.     cmp    word ptr es:[di-5],'I.'
  287.     jne    pgtypeb
  288. pgtypeas:
  289.     mov    pageproc,offset asmpage
  290.     jmp    short sethdr
  291. pgtypeb:
  292.     cmp    word ptr es:[di-3],'SA'
  293.     jne    pgtypec
  294.     cmp    word ptr es:[di-5],'B.'
  295.     jne    pgtypec
  296.     mov    pageproc,offset baspage
  297.     jmp    short sethdr
  298. pgtypec:
  299.     mov    pageproc,offset cpage
  300. sethdr:
  301.     cmp    hdrprint,YES
  302.     je    headprt
  303. noheadsiz:
  304.     mov    hdrprint,NO
  305.     ret
  306. headprt:
  307.     cld
  308.     mov    al,' '
  309.     mov    cx,pgwidth
  310.     cmp    cx,12
  311.     jb    noheadsiz
  312.     mov    hdrlinoff,cx
  313.     mov    hdrpgnum,cx
  314.     sub    hdrpgnum,5
  315.     xor    di,di
  316.     mov    es,hdrlinseg
  317.     rep stosb
  318.     sub    di,5
  319.     mov    ax,curpage
  320.     call    inttoasc0
  321.     mov    word ptr es:[di-10],'aP'
  322.     mov    word ptr es:[di-08],'eg'
  323.     mov    word ptr es:[di-06],'- '
  324.     mov    byte ptr es:[di-04],' '
  325.     mov    deftitle,YES
  326.     xor    ax,ax
  327.     mov    cx,-1
  328.     les    di,header
  329.     cmp    byte ptr es:[di],0
  330.     jne    titlexist
  331.     mov    deftitle,NO
  332.     les    di,nameptr
  333.     les    di,es:[di]
  334. titlexist:
  335.     mov    si,di
  336.   repne scasb
  337.     not    cx
  338.     dec    cx
  339.     mov    ax,pgwidth
  340.     sub    ax,12
  341.     cmp    cx,ax
  342.     jbe    fitstring
  343.     mov    cx,ax
  344. fitstring:
  345.     push    ds
  346.     push    es
  347.     mov    di,marginleft
  348.     mov    es,hdrlinseg
  349.     pop    ds
  350.     rep    movsb
  351.     pop    ds
  352.     mov    al,20h
  353.     stosb
  354. ;
  355.     cmp    deftitle,YES
  356.     jne    putfstat
  357.     jmp    nofname
  358. putfstat:
  359.     mov    ax,4202h
  360.     mov    bx,fhandle
  361.     xor    cx,cx
  362.     mov    dx,cx
  363.     int    21h
  364. ;
  365.     mov    cx,10000
  366.     div    cx
  367.     test    ax,ax
  368.     jz    less10k
  369.     call    inttoascs
  370. less10k:
  371.     mov    ax,dx
  372.     call    inttoascs
  373.     mov    word ptr es:[di],'yB'
  374.     mov    word ptr es:[di+2],'et'
  375.     mov    byte ptr es:[di+4],'s'
  376.     lea    di,[di+6]
  377. ;
  378.     mov    ax,4200h
  379.     mov    bx,fhandle
  380.     xor    cx,cx
  381.     mov    dx,cx
  382.     int    21h
  383. ;
  384.     mov    ax,5700h
  385.     mov    bx,fhandle
  386.     int    21h
  387. ;
  388.     shr    cx,1
  389.     shr    cx,1
  390.     shr    cx,1
  391.     shr    cl,1
  392.     shr    cl,1
  393.     mov    si,cx
  394. ;
  395.     mov    ax,dx
  396.     and    dx,01fh
  397.     shr    ax,1
  398.     mov    cl,4
  399.     shr    al,cl
  400.     xchg    dh,al
  401.     xchg    ah,al
  402.     add    ax,1980
  403.     call    timestamp
  404. nofname:
  405.     mov    di,pgwidth
  406.     sub    di,39
  407.     jb    initend
  408.     mov    si,offset ptmtitle
  409.     mov    cx,ptmttlsz
  410.     rep movsb
  411. ;
  412.     mov    ah,2ch
  413.     int    21h
  414.     mov    si,cx
  415.     mov    ah,2ah
  416.     int    21h
  417.     mov    ax,cx
  418.     call    timestamp
  419. initend:
  420.     ret
  421. ;
  422. initvaliable    endp
  423. ;
  424. initpgbuff  proc
  425. ;
  426.     xor    ax,ax
  427.     mov    curclm,ax
  428.     mov    curlin,ax
  429.     mov    curblk,ax
  430.     mov    cx,pgbufsiz
  431.     les    di,pgbuf
  432.     rep stosw
  433.     mov    ax,marginleft
  434.     mov    bx,offset linptr
  435.     mov    cx,lincnt
  436. setoffloop:
  437.     mov    [bx],ax
  438.     lea    bx,[bx+4]
  439.     loop    setoffloop
  440. ;
  441.     test    ax,ax
  442.     jz    initbuffend
  443.     push    dx
  444.     push    si
  445.     push    di
  446.     mov    si,ax
  447.     mov    bx,offset linptr+2
  448.     mov    dx,lincnt
  449.     mov    al,' '
  450. setmrgnloop:
  451.     mov    es,[bx]
  452.     xor    di,di
  453.     mov    cx,si
  454.     rep stosb
  455.     lea    bx,[bx+4]
  456.     dec    dx
  457.     jnz    setmrgnloop
  458.     pop    di
  459.     pop    si
  460.     pop    dx
  461. initbuffend:
  462.     ret
  463. ;
  464. initpgbuff  endp
  465. ;
  466. reducepagebuff    proc
  467. ;
  468.     std
  469.     mov    al,' '
  470.     mov    bx,offset linptr
  471.     mov    cx,lincnt
  472.     mov    curlin,cx
  473. cmprsloop:
  474.     les    di,[bx]
  475.     mov    cx,di
  476.     jcxz    nocode
  477.     dec    di
  478.   repe    scasb
  479.     je    allspace
  480.     inc    di
  481. allspace:
  482.     inc    di
  483.     mov    byte ptr es:[di],0
  484.     mov    [bx],di
  485. nocode:
  486.     lea    bx,[bx+4]
  487.     dec    curlin
  488.     jnz    cmprsloop
  489. ;
  490.     mov    cx,lincnt
  491.     mov    bx,cx
  492.     dec    bx
  493.     shl    bx,1
  494.     shl    bx,1
  495.     add    bx,offset linptr
  496. reduceloop:
  497.     cmp    word ptr [bx],0
  498.     jne    reducend
  499.     lea    bx,[bx-4]
  500.     loop    reduceloop
  501. reducend:
  502.     cld
  503.     mov    ax,cx
  504.     test    ax,ax
  505.     ret
  506. ;
  507. reducepagebuff    endp
  508. ;
  509. hdrpgupdate proc
  510. ;
  511.     cmp    hdrprint,YES
  512.     jne    noheadprt
  513.     mov    ax,curpage
  514.     mov    di,hdrpgnum
  515.     mov    es,hdrlinseg
  516.     call    inttoasc0
  517.     mov    word ptr es:[di-05],' -'
  518. noheadprt:
  519.     ret
  520. ;
  521. hdrpgupdate endp
  522. ;
  523. timestamp   proc
  524. ;
  525.     call    inttoascs
  526.     mov    byte ptr es:[di],'/'
  527.     inc    di
  528.     mov    al,dh
  529.     aam
  530.     add    ax,'00'
  531.     xchg    ah,al
  532.     stosw
  533.     mov    byte ptr es:[di],'/'
  534.     inc    di
  535.     mov    al,dl
  536.     aam
  537.     add    ax,'00'
  538.     xchg    ah,al
  539.     stosw
  540.     mov    byte ptr es:[di],' '
  541.     inc    di
  542. ;
  543.     mov    ax,si
  544.     mov    al,ah
  545.     aam
  546.     add    ax,'00'
  547.     xchg    ah,al
  548.     stosw
  549.     mov    byte ptr es:[di],':'
  550.     inc    di
  551.     mov    ax,si
  552.     aam
  553.     add    ax,'00'
  554.     xchg    ah,al
  555.     stosw
  556. ;
  557.     ret
  558. ;
  559. timestamp   endp
  560. ;
  561. nopage    proc
  562. ;
  563.     xor    ax,ax
  564.     ret
  565. ;
  566. nopage    endp
  567. ;
  568. asmpage proc
  569. ;
  570.     cld
  571.     push    ds
  572.     pop    es
  573.     mov    di,si
  574. anxtchr:
  575.     lodsb
  576.     cmp    al,0
  577.     je    alnend
  578.     cmp    al,0ch
  579.     je    alnend
  580.     cmp    al,20h
  581.     jbe    anxtchr
  582.     cmp    al,'P'
  583.     je    anxtchk1
  584.     cmp    al,'p'
  585.     jne    alnend
  586. anxtchk1:
  587.     lodsb
  588.     cmp    al,'A'
  589.     je    anxtchk2
  590.     cmp    al,'a'
  591.     jne    alnend
  592. anxtchk2:
  593.     lodsb
  594.     cmp    al,'G'
  595.     je    anxtchk3
  596.     cmp    al,'g'
  597.     jne    alnend
  598. anxtchk3:
  599.     lodsb
  600.     cmp    al,'E'
  601.     je    anxtchk4
  602.     cmp    al,'e'
  603.     jne    alnend
  604. anxtchk4:
  605.     lodsb
  606.     cmp    al,0
  607.     je    apgchg
  608.     cmp    al,';'
  609.     je    apgchg
  610.     cmp    al,'+'
  611.     je    apgchg
  612.     cmp    al,','
  613.     je    alnend
  614.     cmp    al,20h
  615.     ja    short alnend
  616. anxtchk5:
  617.     lodsb
  618.     cmp    al,0
  619.     je    apgchg
  620.     cmp    al,20h
  621.     jbe    anxtchk5
  622.     cmp    al,'+'
  623.     je    apgchg
  624.     cmp    al,';'
  625.     je    apgchg
  626.     cmp    al,','
  627.     je    alnend
  628.     cmp    al,'0'
  629.     jb    apgchg
  630.     cmp    al,'9'
  631.     ja    apgchg
  632. alnend:
  633.     xor    ax,ax
  634.     ret
  635. ;
  636. apgchg:
  637.     xor    ax,ax
  638.     mov    cx,1024
  639.   repne scasb
  640.     sub    cx,1024
  641.     neg    cx
  642.     mov    si,di
  643.     dec    si
  644.     std
  645.     rep movsb
  646.     mov    byte ptr es:[di],0ch
  647.     cld
  648.     jmp    alnend
  649. ;
  650. asmpage endp
  651. ;
  652. baspage proc
  653. ;
  654.     cld
  655.     push    ds
  656.     pop    es
  657.     mov    di,si
  658. ;
  659. bnxtchr:
  660.     lodsb
  661.     cmp    al,0
  662.     je    blnend
  663.     cmp    al,0ch
  664.     je    blnend
  665.     cmp    al,20h
  666.     jbe    bnxtchr
  667.     cmp    al,"'"
  668.     je    bnxtchk0
  669.     cmp    al,'0'
  670.     jb    blnend
  671.     cmp    al,'9'
  672.     ja    blnend
  673.     push    di
  674.     mov    di,si
  675.     call    asctoint
  676.     mov    si,di
  677.     pop    di
  678.     jmp    bnxtchr
  679. blnend:
  680.     xor    ax,ax
  681.     ret
  682. ;
  683. bnxtchk0:
  684.     lodsb
  685.     cmp    al,'@'
  686.     jne    blnend
  687.     lodsb
  688.     cmp    al,'P'
  689.     je    bnxtchk1
  690.     cmp    al,'p'
  691.     jne    blnend
  692. bnxtchk1:
  693.     lodsb
  694.     cmp    al,'A'
  695.     je    bnxtchk2
  696.     cmp    al,'a'
  697.     jne    blnend
  698. bnxtchk2:
  699.     lodsb
  700.     cmp    al,'G'
  701.     je    bnxtchk3
  702.     cmp    al,'g'
  703.     jne    blnend
  704. bnxtchk3:
  705.     lodsb
  706.     cmp    al,'E'
  707.     je    bnxtchk4
  708.     cmp    al,'e'
  709.     jne    blnend
  710. bnxtchk4:
  711. ;
  712.     jmp    apgchg
  713. ;
  714. baspage endp
  715. ;
  716. cpage    proc
  717. ;
  718.     push    ds
  719.     pop    es
  720.     mov    di,si
  721.     cld
  722.     cmp    word ptr [si],'*/'
  723.     jne    cpg2
  724.     cmp    word ptr [si+2],'/*'
  725.     je    cpgchg
  726.     cmp    word ptr [si+2],'*'
  727.     jne    cothers
  728. ;
  729.     cmp    feedflag,YES
  730.     jne    bgnfiln
  731.     mov    byte ptr [di],0ch
  732.     inc    di
  733. bgnfiln:
  734.     mov    byte ptr [di],'/'
  735.     inc    di
  736.     mov    al,'*'
  737.     mov    cx,clmcnt
  738.     dec    cx
  739.     rep stosb
  740.     mov    byte ptr es:[di],0
  741.     jmp    short clnend
  742. cpg2:
  743.     cmp    word ptr [si],'**'
  744.     jne    cothers
  745.     cmp    word ptr [si+2],'/'
  746.     jne    cothers
  747. ;
  748.     cmp    feedflag,YES
  749.     jne    lstfiln
  750.     mov    byte ptr [di],0ch
  751.     inc    di
  752. lstfiln:
  753.     mov    al,'*'
  754.     mov    cx,clmcnt
  755.     dec    cx
  756.     rep stosb
  757.     mov    word ptr [di],'/'
  758. clnend:
  759.     mov    feedflag,NO
  760.     xor    ax,ax
  761.     ret
  762. cpgchg:
  763.     mov    feedflag,YES
  764.     mov    ax,-1
  765.     test    ax,ax
  766.     ret
  767. cothers:
  768.     cmp    byte ptr [si],0ch
  769.     je    clnend
  770.     cmp    feedflag,YES
  771.     jne    clnend
  772.     xor    ax,ax
  773.     mov    cx,1024
  774.   repne scasb
  775.     sub    cx,1024
  776.     neg    cx
  777.     mov    si,di
  778.     dec    si
  779.     std
  780.     rep movsb
  781.     mov    byte ptr es:[di],0ch
  782.     cld
  783.     jmp    clnend
  784. ;
  785. cpage    endp
  786. ;
  787. code    ends
  788.     end
  789.